服务端发送自定义消息给客户端
文档待整理。本文所述可能已不是最佳实践
尽量使用单位属性、技能属性、玩家属性、游戏局属性从服务端同步数据到客户端。 一般只在单独给特定用户发一些一次性消息时,才用自定义消息。
服务端给特定客户端发自定义消息(ui表示向客户端发)
-- player是一个玩家
player:ui 'message_type3' (table1)
player:ui 'message_type4' {
key1 = value1,
key2 = value2
}
服务端广播自定义消息给所有客户端:
base.game:ui 'message_type1' (table1)
base.game:ui 'message_type2' {
key1 = value1,
key2 = value2
}
客户端用类似下面的代码接受自定义消息(放在任意位置即可):
function base.proto.message_type1(table1)
print('query参数是:', lni_writer(table1))
end
要注意一点,当客户端断线重连时,你曾经发过的自定义消息客户端是不知道的(而各类属性则没有这个问题,因此推荐使用各属性来同步数据) 为了改善这个问题,我们给发自定义消息的API加了个参数(服务端代码):
base.game:ui('message_type3', true) {
key1 = value1,
key2 = value2
}
player:ui('message_type4', true) {
key1 = value1,
key2 = value2
}
如果传了这个可选的参数true,则表示这个消息是「必定送达」的。所有「必定送达」的消息,在客户端断线重连后,会依次发至客户端。 不要给所有消息都加上这个true,只给必要的消息加上就可以了。
自定义消息的长度/表大小有限制,长度或者序列化后的表长度超过 1300 * 256时将返回false
local res = base.game:ui('type')('value')
if not res then
log.error('消息太长无法发送')
end